//! Header for the ICar class
#ifndef ICAR_H
#define ICAR_H

#include <iostream>

//! Interface for cars and extras.
/*!
This class is the Interface for all Cars and Decorators.
In terms of Designpatterns it's the component. 
Cars are concrete components and extras are decorators.

The Cars which are decorated are freed automatically.
\class ICar
\author Thomas Pfeiffer
\date 20.11.2012
*/
class ICar {
public:

	//! The DTor of ICar. Implemented to make the DTor virtual.
	virtual ~ICar() {};

	//! Prints a car including its extras
	/*!
	The function Print prints an Extra including
	the ICars it decorates to the ostream out
	\param out The ostream you want to print to   
	*/
	virtual void Print (std::ostream & out) const = 0;

	//! Returns the price of a car + its extras
	virtual float GetPrice() const = 0;

	//! Returns the manufacturer of the car
	virtual std::string const& GetManufacturer() const = 0;

	//! Returns the Type of the Car
	virtual std::string const& GetType() const = 0;

};

#endif